package demo.java.lang.enumeration;

/**
 * 
 * <li>枚举列表必须写在最前面，否则编译出错
 * <li>枚举也可以象一般的类一样添加方法和属性, 你可以为它添加静态和非静态的属性或方法, 这一切都象你在一般的类中做的那样.
 * <li>可以实现接口
 *
 */
public enum Planet implements Behaviour {
    /** 水 */
    MERCURY(3.303e+23, 2.4397e6),
    /** 金 */
    VENUS(4.869e+24, 6.0518e6),
    /** 地 */
    EARTH(5.976e+24, 6.37814e6),
    /** 火 */
    MARS(6.421e+23, 3.3972e6),
    /** 木 */
    JUPITER(1.9e+27, 7.1492e7),
    /** 土 */
    SATURN(5.688e+26, 6.0268e7),
    /** 天 */
    URANUS(8.686e+25, 2.5559e7),
    /** 海 */
    NEPTUNE(1.024e+26, 2.4746e7),
    /** 冥 */
    PLUTO(1.27e+22, 1.137e6);

    /** 质量 - in kilograms */
    private final double mass;
    /** 半径 - in meters */
    private final double radius;

    private Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }

    public double mass() {
        return mass;
    }

    public double radius() {
        return radius;
    }

    /** universal gravitational constant (m3 kg-1 s-2) */
    public static final double G = 6.67300E-11;

    /**
     * 万有引力: 两个物体之间的引力。
     * <li>G:万有引力常量，
     * <li>m1: 物体1的质量，
     * <li>m2: 物体2的质量，
     * <li>r: 两个物体之间的距离(大小)(r表示径向矢量)
     * <li>依照国际单位制，F的单位为牛顿(N)，
     * <li>m1和m2的单位为千克(kg)，
     * <li>r 的单位为米(m)，
     * <li>常数G近似地等于 G=6.67×10⁻¹¹ N·m²/kg²（牛顿平方米每二次方千克）。
     * 
     * F=GMm/rr
     * 
     * @return
     */
    public double surfaceWeight(double otherMass) {
        return otherMass * G * mass / (radius * radius);
    }

    @Override
    public void print() {
        System.out.printf("%s 星球：质量 %s 千克,半径： %s 米 %n", this.name(), this.mass, this.radius);
    }
}